DISTINCT不能和order by一起使用的问题 您所在的位置:网站首页 start from now 为什么不能与on连用 DISTINCT不能和order by一起使用的问题

DISTINCT不能和order by一起使用的问题

2024-07-10 08:17| 来源: 网络整理| 查看: 265

今天写sql突然报错:

Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-01791: 不是 SELECTed 表达式

SELECT DISTINCT menu.SYS_MENU_ID, menu.MENU_NAME, menu.MENU_CODE, menu.PARENT_MENU_ID, menu.MENU_URL, menu.MENU_ROAD, res.SYS_RESOURCE_ID, res.RESC_TYPE FROM SYS_MENU menu LEFT JOIN SYS_RESOURCE res ON menu.SYS_MENU_ID = res.SYS_MENU_ID AND res.RESC_TYPE = 'MENU' LEFT JOIN SYS_RESC_PRMSN_CONTRL c ON res.SYS_RESOURCE_ID = c.SYS_RESOURCE_ID AND c.TARGET_TYPE = 'ROLE' AND c.TARGET_ID IN ( '1405365037018644481', '1405365037018644482' ) WHERE menu.SYS_MENU_ID NOT IN ( '1', '3', '4' ) AND menu.IS_VALID = '1' AND menu.MENU_GROUP = '1' AND c.RESC_STATUS = '1' ORDER BY menu.SORT_NO ASC

现象: 1.去掉 ORDER BY menu.SORT_NO ASC 或 DISTINCT 以后发现能正常查询,得出DISTINCT不能和order by一起使用

分析原因: 首先,distinct的执行顺序高于order by。 第二,distinct执行时会对查询的记录进行去重,产生一张虚拟的临时表; 第三,order by执行时对查询的虚拟临时表进行排序,产生新的虚拟临时表。 综合来看,如果order by的字段不在select中,执行sql语句时首先执行distinct,之后产生的虚拟临时表中没有order by的字段,所以再执行order by时会报错。

解决: 在sql的查询字段中添加排序的字段即可



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有